/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufsc.aps.convocados;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * @author gustavo.ramos
 */
public class Posicao implements Serializable {

    private TipoPosicao tipo;
    private List<Jogador> jogadores;
    private Integer pontuacao;

    public Posicao(TipoPosicao tipo, Integer limiteMaximoPosicao) {
        this.tipo = tipo;
        this.limiteMaximoPosicao = limiteMaximoPosicao;
        jogadores = new ArrayList<Jogador>();
    }
    private Integer limiteMaximoPosicao;

    /**
     *
     * @return pontos bonus
     */
    public Integer getNumeroJogadores() {
        return getJogadores().size();
    }

    public Integer calcularBonus() {
        Collections.sort(jogadores);
        if (jogadores.size() < 2) {
            return 0;
        } else {
            boolean sequencia = true, camisasIguais = true, mesmaNacionalidade = true;
            for (int i = 0; i < jogadores.size() - 1; i++) {
                if (sequencia) {
                    if (!jogadores.get(i).getNumero().equals(jogadores.get(i + 1).getNumero() - 1)) {
                        sequencia = false;
                    }
                }
                if (camisasIguais) {
                    if (!jogadores.get(i).getNumero().equals(jogadores.get(i + 1).getNumero())) {
                        camisasIguais = false;
                    }
                }
                if (mesmaNacionalidade) {
                    if (!jogadores.get(i).getNacionalidade().equals(jogadores.get(i + 1).getNacionalidade())) {
                        mesmaNacionalidade = false;
                    }
                }
            }
            if (mesmaNacionalidade && sequencia) {
                return 3;
            } else if (mesmaNacionalidade) {
                return 1;
            } else if (sequencia) {
                return 1;
            } else if (camisasIguais) {
                return 1;
            } else {
                return 0;
            }
        }
    }

    /**
     * @return the jogadores
     */
    public List<Jogador> getJogadores() {
        return jogadores;
    }

    /**
     * @param jogadores the jogadores to set
     */
    public void setJogadores(List<Jogador> jogadores) {
        this.jogadores = jogadores;
    }

    /**
     * @return the pontuacao
     */
    private Integer getPontuacaoSemBonus() {
        int pontos = 0;
        for (Jogador j : jogadores) {
            if (this.getTipo().equals(TipoPosicao.ATAQUE)) {
                pontos += j.getAtaque();
            } else if (this.getTipo().equals(TipoPosicao.MEIO)) {
                pontos += j.getMeioCampo();
            } else if (this.getTipo().equals(TipoPosicao.DEFESA)) {
                pontos += j.getDefesa();
            }
        }
        return pontos;
    }

    public void adicionarJogador(Jogador novo) {
        jogadores.add(novo);
        Collections.sort(jogadores);
    }

    public void substituirJogador(Jogador novo, Jogador substituido) {
        int i = jogadores.indexOf(substituido);
        jogadores.remove(i);
        adicionarJogador(novo);
    }

    /**
     * @param pontuacao the pontuacao to set
     */
    public void setPontuacao(Integer pontuacao) {
        this.pontuacao = pontuacao;
    }

    /**
     * @return the limiteMaximoPosicao
     */
    public Integer getLimiteMaximoPosicao() {
        return limiteMaximoPosicao;
    }

    /**
     * @param limiteMaximoPosicao the limiteMaximoPosicao to set
     */
    public void setLimiteMaximoPosicao(Integer limiteMaximoPosicao) {
        this.limiteMaximoPosicao = limiteMaximoPosicao;
    }

    public Integer getTotalPontuacao() {
        return getPontuacaoSemBonus() + calcularBonus();
    }

    /**
     * @return the tipo
     */
    public TipoPosicao getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(TipoPosicao tipo) {
        this.tipo = tipo;
    }
}
